package entities;

import java.io.Serializable;
import java.lang.String;
import java.util.Date;
import java.util.List;

import javax.persistence.*;


/**
 * Entity implementation class for Entity: PacchettoViaggio
 *
 */
@Entity
@Table(name="PacchettoViaggio")
@NamedQueries({
	@NamedQuery(name= "PacchettoViaggio.FIND_ALL", query="SELECT p FROM PacchettoViaggio p ORDER BY p.idPacchettoViaggio ASC"),
	@NamedQuery(name= "PacchettoViaggio.FIND_ONE", query="SELECT p FROM PacchettoViaggio p WHERE p.idPacchettoViaggio=:id"),
	@NamedQuery(name= "PacchettoViaggio.FIND", query= "SELECT p FROM PacchettoViaggio p WHERE p.nome=:nome OR p.destinazione=:destinazione OR"
			+ " p.numeroPersone=:numeroPersone OR p.prezzo < :prezzo OR (:data > p.dataInizio AND :data < p.dataFine)"),
	@NamedQuery(name= "PacchettoViaggio.CANCELLA", query="DELETE FROM PacchettoViaggio p WHERE p.idPacchettoViaggio=:id"),
	@NamedQuery(name= "PacchettoViaggio.MODIFICA", query="UPDATE PacchettoViaggio p SET p.nome=:nome, p.destinazione=:destinazione, p.dataInizio=:dataInizio, p.dataFine=:dataFine, p.dataPartenza=:dataPartenza, p.dataRitorno=:dataRitorno, p.numeroPersone=:numeroPersone, p.prezzo=:prezzo WHERE p.idPacchettoViaggio=:id")
})
public class PacchettoViaggio implements Serializable {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int idPacchettoViaggio;
	private String nome;
	private String destinazione;
	@Temporal(TemporalType.DATE)
	private Date dataInizio;
	@Temporal(TemporalType.DATE)
	private Date dataFine;
	@Temporal(TemporalType.DATE)
	private Date dataPartenza;
	@Temporal(TemporalType.DATE)
	private Date dataRitorno;
	private int numeroPersone;
	private int prezzo;
	
	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinTable(
			name="VoloAndPacchetto",
			joinColumns={
					@JoinColumn(name="IDPACCHETTOVIAGGIO", referencedColumnName="IDPACCHETTOVIAGGIO")
			},
			inverseJoinColumns={
					@JoinColumn(name="IDVOLO", referencedColumnName="IDVOLO")
				}
	)
	private Volo voloAndata;
	
	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinTable(
			name="VoloRitPacchetto",
			joinColumns={
					@JoinColumn(name="IDPACCHETTOVIAGGIO", referencedColumnName="IDPACCHETTOVIAGGIO")
			},
			inverseJoinColumns={
					@JoinColumn(name="IDVOLO", referencedColumnName="IDVOLO")
				}
	)
	private Volo voloRitorno;
	
	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinTable(
			name="HotelPacchetto",
			joinColumns={
					@JoinColumn(name="IDPACCHETTOVIAGGIO", referencedColumnName="IDPACCHETTOVIAGGIO")
			},
			inverseJoinColumns={
					@JoinColumn(name="IDHOTEL", referencedColumnName="IDHOTEL")
				}
	)
	private Hotel hotel;
	
	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinTable(
			name="EscursionePacchetto",
			joinColumns={
					@JoinColumn(name="IDPACCHETTOVIAGGIO", referencedColumnName="IDPACCHETTOVIAGGIO")
			},
			inverseJoinColumns={
					@JoinColumn(name="IDESCURSIONE", referencedColumnName="IDESCURSIONE")
				}
	)
	private Escursione escursione;
	
	@ManyToMany(cascade = CascadeType.PERSIST)
	@JoinTable(
			name="AlternativeHotelPacchetto",
			joinColumns={
					@JoinColumn(name="IDPACCHETTOVIAGGIO", referencedColumnName="IDPACCHETTOVIAGGIO")
			},
			inverseJoinColumns={
					@JoinColumn(name="IDHOTEL", referencedColumnName="IDHOTEL")
				}
	)
	private List<Hotel> alternativeHotel;
	
	@ManyToMany(cascade = CascadeType.PERSIST)
	@JoinTable(
			name="AlternativeEscursionePacchetto",
			joinColumns={
					@JoinColumn(name="IDPACCHETTOVIAGGIO", referencedColumnName="IDPACCHETTOVIAGGIO")
			},
			inverseJoinColumns={
					@JoinColumn(name="IDESCURSIONE", referencedColumnName="IDESCURSIONE")
				}
	)
	private List<Escursione> alternativeEsc;
	
	private static final long serialVersionUID = 1L;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public PacchettoViaggio() {
		super();
	}   
	
	public int getIdPacchettoViaggio() {
		return this.idPacchettoViaggio;
	}

	public void setIdPacchettoViaggio(int idPacchettoViaggio) {
		this.idPacchettoViaggio = idPacchettoViaggio;
	}   
	public String getDestinazione() {
		return this.destinazione;
	}

	public void setDestinazione(String destinazione) {
		this.destinazione = destinazione;
	}   
	public Date getDataInizio() {
		return this.dataInizio;
	}

	public void setDataInizio(Date dataInizio) {
		this.dataInizio = dataInizio;
	}   
	public Date getDataFine() {
		return this.dataFine;
	}

	public void setDataFine(Date dataFine) {
		this.dataFine = dataFine;
	}   
	public Date getDataPartenza() {
		return dataPartenza;
	}

	public void setDataPartenza(Date dataPartenza) {
		this.dataPartenza = dataPartenza;
	}

	public Date getDataRitorno() {
		return dataRitorno;
	}

	public void setDataRitorno(Date dataRitorno) {
		this.dataRitorno = dataRitorno;
	}

	public int getNumeroPersone() {
		return this.numeroPersone;
	}

	public void setNumeroPersone(int numeroPersone) {
		this.numeroPersone = numeroPersone;
	}   
	public int getPrezzo() {
		return this.prezzo;
	}

	public void setPrezzo(int prezzo) {
		this.prezzo = prezzo;
	}   
	
	public Volo getVoloAndata() {
		return voloAndata;
	}

	public void setVoloAndata(Volo voloAndata) {
		this.voloAndata = voloAndata;
	}

	public Volo getVoloRitorno() {
		return voloRitorno;
	}

	public void setVoloRitorno(Volo voloRitorno) {
		this.voloRitorno = voloRitorno;
	}

	public Hotel getHotel() {
		return hotel;
	}

	public void setHotel(Hotel hotel) {
		this.hotel = hotel;
	}

	public Escursione getEscursione() {
		return escursione;
	}

	public void setEscursione(Escursione escursione) {
		this.escursione = escursione;
	}

	public List<Hotel> getAlternativeHotel() {
		return alternativeHotel;
	}
	public void setAlternativeHotel(List<Hotel> alternativeHotel) {
		this.alternativeHotel = alternativeHotel;
	}
	public List<Escursione> getAlternativeEsc() {
		return alternativeEsc;
	}
	public void setAlternativeEsc(List<Escursione> alternativeEsc) {
		this.alternativeEsc = alternativeEsc;
	}
}
